home *** CD-ROM | disk | FTP | other *** search
/ BCI NET 2 / BCI NET 2.iso / archives / programming / gui / precog2_1.lha / Precognition2_1 / src / src.lha / Library / cyclegadget.c < prev    next >
Encoding:
C/C++ Source or Header  |  1994-07-19  |  7.7 KB  |  308 lines

  1. #include <stdio.h>
  2. #include "CycleGadget.h"
  3. #include "CycleGadgetClass.h"
  4. #include "BoolGadgetClass.h"
  5. #include "precognition.h"
  6. #include "minmax.h"
  7. #include "AmigaMem.h"
  8. #ifndef __GNUC__
  9. #include <clib/exec_protos.h>
  10. #include <clib/graphics_protos.h>
  11. #include <clib/intuition_protos.h>
  12. #endif
  13. #ifdef __GNUC__
  14. #include <proto/exec.h>
  15. #include <proto/graphics.h>
  16. #include <proto/intuition.h>
  17. #endif
  18. #ifdef __SASC
  19. #include <proto/exec.h>
  20. #include <proto/graphics.h>
  21. #include <proto/intuition.h>
  22. #endif
  23. /* Additions for prototypes -- EDB */
  24. #include "EmbossedGadgetClass.h"
  25.  
  26.  
  27. void CycleGadget_CleanUp( CycleGadget *self )
  28. {
  29.    Afree( self->bg.BoxBorder->BottomRight.NextBorder );
  30.    self->bg.BoxBorder->BottomRight.NextBorder = NULL;
  31.    StringList_CleanUp( &self->sl );
  32. }
  33.  
  34.  
  35. Point CycleGadget_AskSize( CycleGadget *self,
  36.                             PIXELS       Width,
  37.                             PIXELS       Height )
  38. {
  39.    Point size;
  40.  
  41.    size.y = 14;
  42.    size.x = MAX( Width, 32 );
  43.  
  44.    return size;
  45. }
  46.  
  47.  
  48.  
  49. USHORT CycleGadget_ClaimEvent( CycleGadget   *self,
  50.                                IntuiMessage  *event )
  51. {
  52.    USHORT response = 0;
  53.  
  54.    switch( event->Class )
  55.    {
  56.       case REFRESHWINDOW:
  57.          response = RESPONDED;
  58.          break;
  59.  
  60.       case GADGETUP:
  61.          if( event->IAddress == (void *)&self->bg.g )
  62.          {
  63.             response = RESPONDED | CONSUMED_EVENT | CHANGED_STATE;
  64.          }
  65.          break;
  66.  
  67.    }
  68.  
  69.    return response;
  70. }
  71.  
  72.  
  73. LONG CycleGadget_Value( CycleGadget *self )
  74. {
  75.    return (LONG)self->bg.state;
  76. }
  77.  
  78. LONG CycleGadget_SetValue( CycleGadget *self,
  79.                            LONG         selection )
  80. {
  81.    USHORT s;
  82.  
  83.    s = MIN( selection, self->sl.nEntries );
  84.    s = MAX( s, 0 );
  85.  
  86.    self->bg.state = s;
  87.  
  88.    Forbid();
  89.    self->Format.IText = self->sl.Entries[s];
  90.    Permit();
  91.  
  92.    return (LONG)s;
  93. }
  94.  
  95.  
  96.  
  97. void CycleGadget_Render( CycleGadget *self,
  98.                          RastPort    *RPort )
  99. {
  100.    PIXELS xmin, xmax, ymin, ymax;
  101.  
  102.    xmin = self->bg.Location.x + 2;
  103.    ymin = self->bg.Location.y + 2;
  104.    xmax = xmin + self->bg.Size.x - 4;
  105.    ymax = ymin + self->bg.Size.y - 4;
  106.    SetAPen( RPort, self->bg.Pens.BackPen );
  107.    SetDrMd( RPort, JAM1 );
  108.    RectFill( RPort, xmin, ymin, xmax, ymax );
  109.    SetAPen( RPort, self->bg.Pens.FrontPen );
  110.    PrintIText( RPort,  &self->Format, self->bg.Location.x, self->bg.Location.y );
  111.  
  112.    EmbossedGadget_Render( &self->bg, RPort );
  113. }
  114.  
  115. void CycleGadget_Refresh( CycleGadget *self )
  116. {
  117.    pcgWindow *window;
  118.    RastPort  *rport;
  119.    Point loc;
  120.  
  121.    if( window = InteractorWindow( (Interactor *)self ) )
  122.    {
  123.       EmbossedGadget_Refresh( (EmbossedGadget *)self );
  124.       rport = RPort( window );
  125.       loc   = Location( (GraphicObject *)self );
  126.       PrintIText( rport, &self->Format, loc.x, loc.y );
  127.    }
  128. }
  129.  
  130.  
  131. USHORT CycleGadget_Respond( CycleGadget  *self,
  132.                             IntuiMessage *event )
  133. {
  134.    USHORT     response = 0;
  135.    Window    *window;
  136.    USHORT     selection;
  137.  
  138.    switch( event->Class )
  139.    {
  140.       case REFRESHWINDOW:
  141.          response = RESPONDED;
  142.          break;
  143.  
  144.       case GADGETUP:
  145.          if( event->IAddress == (void *)&self->bg.g )
  146.          {
  147.             window = event->IDCMPWindow;
  148.  
  149.             selection = self->bg.state + 1;
  150.  
  151.             if( selection == self->sl.nEntries )
  152.                selection = 0;
  153.  
  154.             SetValue( (Valuator *)self, selection );
  155.             Render( (GraphicObject *)self, window->RPort );
  156.  
  157.             response = RESPONDED | CONSUMED_EVENT | CHANGED_STATE;
  158.          }
  159.          break;
  160.  
  161.    }
  162.  
  163.    return response;
  164. }
  165.  
  166.  
  167.  
  168. BOOL CycleGadget_elaborated = FALSE;
  169.  
  170. struct ValuatorClass CycleGadget_Class;
  171.  
  172. void CycleGadgetClass_Init( struct ValuatorClass *class )
  173. {
  174.    BoolGadgetClass_Init( class );
  175.    class->isa         = BoolGadgetClass();
  176.    class->ClassName   = "CycleGadget";
  177.  
  178. /* -------- Commented-out methods are inherited ----------------*/
  179.    class->CleanUp     = (void(*)(PObject *))CycleGadget_CleanUp;
  180.    class->AskSize     = (Point(*)(GraphicObject *, PIXELS, PIXELS))CycleGadget_AskSize;
  181.    class->SizeFlags   = GraphicObject_SizeFlagsX;
  182.    class->Render      = (void(*)(GraphicObject *, RastPort *))CycleGadget_Render;
  183.    class->Refresh     = (void(*)(Interactor *))CycleGadget_Refresh;
  184.    class->ClaimEvent  = (USHORT(*)(Interactor *, IntuiMessage *))CycleGadget_ClaimEvent;
  185.    class->Respond     = (USHORT(*)(Interactor *, IntuiMessage *))CycleGadget_Respond;
  186.    class->Value       = (LONG(*)(Valuator *))CycleGadget_Value;
  187.    class->SetValue    = (LONG(*)(Valuator *, LONG))CycleGadget_SetValue;
  188. /*   class->SetTitle    = EmbossedGadget_SetTitle;*/
  189.  
  190.  
  191. }
  192.  
  193.  
  194. struct ValuatorClass *CycleGadgetClass( void )
  195. {
  196.    if( ! CycleGadget_elaborated )
  197.    {
  198.       CycleGadgetClass_Init( &CycleGadget_Class );
  199.       CycleGadget_elaborated = TRUE;
  200.    }
  201.  
  202.    return &CycleGadget_Class;
  203. }
  204.  
  205.  
  206. WORD Cycle_BrightLinePoints[] = { 15,1, 15,12 };
  207. WORD Cycle_DarkLinePoints[]   = { 14,1, 14,12 };
  208. WORD Cycle_ArrowPoints[] =
  209.   { 10,3, 10, 7, 12,5, 7,5, 9,7, 9,2,  5,2,
  210.      4,3,  4,10,  5,3, 5,11, 9,11, 9,10, 10,10 };
  211.  
  212.  
  213. typedef struct CycleBorder
  214.    {
  215.       Border BrightLine;
  216.       Border DarkLine;
  217.       Border Arrow;
  218.    } CycleBorder;
  219.  
  220.  
  221. CycleBorder *CycleBorder_New( pcg_3DPens Pens )
  222. {
  223.    CycleBorder *border;
  224.  
  225.    border = (CycleBorder *) Acalloc( 1, sizeof( CycleBorder ) );
  226.    border->BrightLine.LeftEdge   = 0;
  227.    border->BrightLine.TopEdge    = 0;
  228.    border->BrightLine.FrontPen   = Pens.BrightPen;
  229.    border->BrightLine.BackPen    = Pens.BackPen;
  230.    border->BrightLine.DrawMode   = JAM1;
  231.    border->BrightLine.Count      = 2;
  232.    border->BrightLine.XY         = Cycle_BrightLinePoints;
  233.    border->BrightLine.NextBorder = &border->DarkLine;
  234.  
  235.    border->DarkLine.LeftEdge   = 0;
  236.    border->DarkLine.TopEdge    = 0;
  237.    border->DarkLine.FrontPen   = Pens.DarkPen;
  238.    border->DarkLine.BackPen    = Pens.BackPen;
  239.    border->DarkLine.DrawMode   = JAM1;
  240.    border->DarkLine.Count      = 2;
  241.    border->DarkLine.XY         = Cycle_DarkLinePoints;
  242.    border->DarkLine.NextBorder = &border->Arrow;
  243.  
  244.    border->Arrow.LeftEdge   = 0;
  245.    border->Arrow.TopEdge    = 0;
  246.    border->Arrow.FrontPen   = Pens.FrontPen;
  247.    border->Arrow.BackPen    = Pens.BackPen;
  248.    border->Arrow.DrawMode   = JAM1;
  249.    border->Arrow.Count      = 14;
  250.    border->Arrow.XY         = Cycle_ArrowPoints;
  251.    border->Arrow.NextBorder = NULL;
  252.  
  253.    return border;
  254. }
  255.  
  256. void CycleGadget_Init( CycleGadget  *self,
  257.                        PIXELS        LeftEdge,
  258.                        PIXELS        TopEdge,
  259.                        PIXELS        Width,
  260.                        pcg_3DPens    Pens,
  261.                        char         *label,
  262.                        char        **Choices )
  263. {
  264.    Point     size;
  265.    AlignInfo *ainfo;
  266.  
  267.    self->bg.isa  = CycleGadgetClass();
  268.    size          = AskSize( (GraphicObject *)self, Width, 0 );
  269.  
  270.    BoolGadget_Init( &self->bg, LeftEdge, TopEdge, size.x, size.y,
  271.                         Pens, NULL );
  272.  
  273.    ainfo = TextAlignment( (GraphicObject *)self );
  274.    SetTextAlignment( (GraphicObject *)self, tx_OUTSIDE | tx_LEFT | tx_YCENTER,
  275.       ainfo->Xpad, ainfo->Ypad );
  276.  
  277.  
  278.    self->bg.isa     = CycleGadgetClass();
  279.  
  280. /* Remove GADGHCOMP -- EDB */
  281.    self->bg.g.Flags = /* GFLG_GADGHNONE; */ GADGHCOMP;
  282.  
  283.    self->bg.BoxBorder->BottomRight.NextBorder =
  284.       (Border *)CycleBorder_New( Pens );
  285.  
  286.  
  287.    StringList_Init( &self->sl, FALSE );
  288.  
  289.    self->bg.state               = 0;
  290.    self->bg.LabelText.NextText  = &self->Format;
  291.  
  292.    self->Format.FrontPen  = Pens.FrontPen;
  293.    self->Format.BackPen   = Pens.BackPen;
  294.    self->Format.DrawMode  = JAM1;
  295.    self->Format.LeftEdge  = 20;
  296.    self->Format.TopEdge   = 3;
  297.  
  298.    self->Format.ITextFont = DefaultFont( (GraphicObject *)self ); /* &pcg_Topaz80; */
  299.  
  300.    self->Format.IText     = (Choices ? Choices[0] : NULL);
  301.    self->Format.NextText  = NULL;
  302.  
  303.    if( Choices )
  304.       StringList_AddStrings( &self->sl, Choices, 0 );
  305.  
  306.    SetTitle( (GraphicObject *)self, label );
  307. }
  308.